home *** CD-ROM | disk | FTP | other *** search
/ Wonky Flux Batch 2019 02 / Wonky_Flux_Batch_2019-02.zip / Wonky Flux Batch 2019-02 / 090 - CAD Draw.dsk / T.APSOFT I.s < prev    next >
Text File  |  2019-02-17  |  42KB  |  1,681 lines

  1.           PAG
  2. *****************************
  3. *                 T         *
  4. *    Applesof;PGPPart I     *
  5. *            {{{           *
  6. * Copywrite Apple Computer, *
  7. * Inc. and Microsoft, Inc.; *
  8. * not for publication or    *
  9. * distribution.             *
  10. *                           *
  11. *****************************
  12. *                           *
  13. *   Input parsing,          *
  14. *   Routine addressing,     *
  15. *   For-next loops, etc.    *
  16. *                           *
  17. *      $D000 - $DD66        *
  18. *                           *
  19. *****************************
  20.  
  21. * Equates for all parts:
  22.  
  23. * Applesoft tokens:
  24.  
  25. for       = $81
  26. data      = $83
  27. pop       = $A1
  28. goto      = $AB
  29. gosub     = $B0
  30. rem       = $B2
  31. print     = $BA
  32. tab       = $C0
  33. to        = $C1
  34. fn        = $C2
  35. spc       = $C3
  36. then      = $C4
  37. at        = $C5
  38. not       = $C6
  39. step      = $C7
  40. plus      = $C8
  41. minus     = $C9
  42. equal     = $D0
  43. sgn       = $D2
  44. scrn      = $D7
  45. leftstr   = $E8
  46.  
  47. * Zero page locations:
  48.  
  49. GOWARM    = 0            ;Set up by cold start
  50. GOSTROUT  = 3            ; but not used anywhere.
  51. USR       = $A
  52. CHARAC    = $D
  53. ENDCHR    = $E
  54. PNTR      = $F
  55. NUMDIM    = $F           ;Used in array rtns
  56. DIMFLG    = $10
  57. VALTYP    = $11          ;$FF for string, 0 if numeric
  58. INTFLG    = $12          ;- for int var
  59. DATAFLG   = $13          ;Used in PARSE
  60. GARFLG    = DATAFLG      ;Used in GARBAG
  61. SUBFLG    = $14
  62. INPUTFLG  = $15          ;Has $40 for GET, $98 for READ
  63. CPRMASK   = $16          ;Receives CPRTYP in FRMEVL
  64. SIGNFLG   = $16          ;Flags sign in TAN
  65. SHAPEL    = $1A
  66. SHAPEH    = $1B
  67. HCOLOR1   = $1C
  68. COUNTH    = $1D
  69. CH        = $24
  70. GBASL     = $26
  71. GBASH     = $27
  72. H2        = $2C
  73. V2        = $2D
  74. HMASK     = $30
  75. INVFLZg  $32
  76. PROMPT    = $33
  77. A1L       = $3C
  78. A1H       = $3D
  79. A2L       = $3E
  80. A2H       = $3[8INNUM = $50
  81. TEMPPT     ~52
  82. LASTPT    = $53
  83. TEMPST    = $55
  84. INDEX     = $5EqST = $60
  85. RESULT    = $62
  86. TXTTAB    = 9um
  87. VARTAB    = $69
  88. ARYTAB    = $6B
  89. STREND    = $6D
  90. FRETOP    = $6F
  91. FRESPC    = $71
  92. MEMSIZ    = $73
  93. CURLIN    = $75
  94. OLDLIN    = $77
  95. OLDTEXT   = $79
  96. DATLIN    = $7B
  97. DATPTR    = $7D
  98. INPTR     = $7F
  99. VARNAM    = $81          ;$:+-, %:--, real:++, fnc:-+
  100. VARPNT    = $83
  101. FORPNT    = $85
  102. TXPSV     = $87WUsed in IK)D
  103. LASTOP    = $87          ;Scratch flag used in FRMEVL
  104. CPRTYP    = $89          ;>,=,< flag in FRMEVL
  105. FNCNAM    = $8A
  106. DSCPTR    = $8C
  107. DSCLEN    = $8F          ;Used in GARBAG
  108. JMPADRS   = $90
  109. LENGTH    = $91          ;Used in GARBAG
  110. ARYPNT    = $94          ;Used in GARBAG
  111. HIGHDS    = $94
  112. HIGHTR    = $96
  113. INDX      = $99          ;Used by array rtns
  114. LOWTR     = $9B
  115. DSCTMP    = $9D
  116. VPNT      = $A0          ;Temp var ptr
  117. EXTRASV   = $92          ;FP extra precision
  118. TEMP1     = $93          ;Save areas for FAC
  119. TEMP2     = $98
  120. TEMP3     = $8A
  121. TMPEXP    = $99          ;Used in%bd;Vg`cx]3^'O=%b$$P|;XibE88pG%//{dNf)D{jCL5w,[NZiJ_97%on
  122. QM*baj_xVn ~Bv.
  123. FAC       = $9D          ;Primary floating pnt acc
  124. SERLEN    = $A3          ;Holds length of series-1
  125. FPGEN     = $A4
  126. ARG       = $A5          ;Secondary fp acc
  127. FACSGN    = FAC+5        ;Holds unpacked sign
  128. ARGSGN    = ARG+5
  129. SGNCPR    = $AB          ;Flags opp sign in FP rout.
  130. EXTRAFAC  = $AC          ;FP precision
  131. SERPNT    = $AD          ;Pntr to series data in FP
  132. STRNG1    = $AB
  133. STRNG2    = $AD
  134. PRGEND    = $AF
  135. CHRGET    = $B1
  136. CHRGOT    = $B7
  137. TXTPTR    = $B8
  138. RNDSEED   = $C9
  139. DXL       = $D0
  140. DXH       = $D1
  141. DY        = $D2
  142. QDRNT     = $D3
  143. EL        = $D4
  144. EH        = $D5
  145. LOCK      = $D6          ;Prevents user accevs if#-
  146. ERRFLG    = $D8
  147. ERRLIN    = $DA
  148. ERRPOVY,={f"}z9(-Dwu<<;BE$$DF
  149. r       = $E0
  150. X0H       = $E1
  151. Y0        = $E2
  152. HCOLORZ   = $E4
  153. HNDX      = $E5
  154. HPAG      = $E6
  155. SCALEZ    = $E7
  156. SHAPEPNT  = $E8
  157. COLCOUNT  = $EA
  158. FIRST     = $F0
  159. SPEEDZ    = $F1          ;Output speed
  160. TRCFLG    = $F2
  161. ORMASK    = $F3          ;Has $40 for flash
  162. TXTPSV    = $F4
  163. CURLSV    = $F6
  164. REMSTK    = $F8
  165. ROTZ      = $F9
  166. * $FF is also used by the string out rtns.
  167.  
  168. * Apple stuff:
  169.  
  170. STACK     = $100
  171. IN        = $200
  172. AMPER     = $3F5
  173. KEY       = $C000
  174. TXTCLR    = $C050
  175. MIXCLR    = $C052
  176. MIXSET    = $C053
  177. LOWSCR    = $C054
  178. HISCR     = $C055
  179. LORES     = $C056
  180. HIRES     = $C057
  181. HOME      = $FC58
  182. RD2BIT    = $FCFA
  183. GETLN     = $FD6A
  184. RDKEY     = $FD0C
  185. WRITE     = $FECD
  186. COUT      = $FDED
  187. MONWAIT   = $FCA8
  188. SCRN      = $F871
  189. PREAD     = $FB1E
  190. INPORT    = $FE8B
  191. OUTPORT   = $FE95
  192. MONPLOT   = $F800
  193. HLINE     = $F819
  194. VLINE     = $F828
  195. SETCOL    = $F864
  196. TABV      = $FB5B
  197. SETGR     = $FB40
  198. SETTXT    = $FB39
  199. MONREAD   = $FEFD
  200. MONREAD2  = $FF02
  201.  
  202. CMDTABL   DA END-1
  203.           DA FOR-1
  204.           DA NEXT-1
  205.           DA DATA-1
  206.           DA INPUT-1
  207.           DA DEL-1
  208.           DA DIM-1
  209.           DA READ-1
  210.           DA GR-1
  211.           DA TEXT-1
  212.           DA PRNU-1
  213.           DA INNU-1
  214.           DA CALL-1
  215.           DA PLOT-1
  216.           DA HLIN-1
  217.           DA VLIN-1
  218.           DA HGR2-1
  219.           DA HGR-1
  220.           DA HCOLOR-1
  221.           DA HPLOT-1
  222.           DA DRAW-1
  223.           DA XDRAW-1Z/DA HTAB-1
  224.           DA HOME-1
  225.           DA ROT-1
  226.           DA SCALE-1
  227.           DA SHLOAD-1
  228.           DA TRACE-1
  229.           DA NOTRACE-1
  230.           DA NORMAL-1
  231.           DA INVERSE-1
  232.           DA FLASH-1
  233.           DA COLOR-1
  234.           DA POP-1
  235.           DA VTAB-1
  236.           DA HIMEM-1
  237.           DA LOMEM-1
  238.           DA ONERR-1
  239.           DA RESUME-1
  240.           DA RECALL-1
  241.           DA STORE-1
  242.           DA SPEED-1
  243.           DA LET-1
  244.           DA GOTF-1
  245.           DA RUN-1
  246.           DA IF-1
  247.           DA RESTORE-1
  248.           DA AMPER-1
  249.           DA GOSUB-1
  250.           DA POP-1       ;RETURN
  251.           DA REM-1
  252.           DA STOP-1
  253.           DA ONGOTO-1
  254.           DA WAIT-1
  255.           DA LOAD-1
  256.           DA SAVE-1
  257.           DA DEF-1
  258.           DA POKE-1
  259.           DA PRINT-1
  260.           DA CONT-1
  261.           DA LIST-1
  262.           DA CLEAR-1
  263.           DA GET-1
  264.           DA NEW-1
  265. UNFNC     DA SGN
  266.           DA INT
  267.           DA ABS
  268.           DA USR
  269.           DA FRE
  270.           DA ERROR       ;SCRN done special
  271.           DA PDL
  272.           DA POS
  273.           DA SQR
  274.           DA RND
  275.           DA LOG
  276.           DA EXP
  277.           DA COS
  278.           DA SIN
  279.           DA TAN
  280.           DA ATN
  281.           DA PEEK
  282.           DA LEN
  283.           DA STR
  284.           DA VAL
  285.           DA ASC
  286.           DA CHRSTR
  287.           DA LEFTSTR
  288.           DA RIGHTSTR
  289.           DA MIDSTR
  290.  
  291. * The hex #s are for preference testing:
  292.  
  293. MATHTBL   HEX 79
  294.           DA FADDT-1
  295.           HEX 79
  296.           DA FSUBT-1
  297.           HEX 7B
  298.           DA FMULTT-1
  299.           HEX 7B
  300.           DA FDIVT-1
  301.           HEX 7D
  302.           DA FPWRT-1
  303.           HEX 50
  304.           DA AND-1
  305.           HEX 46
  306.           DA OR-1
  307. MINUS     HEX 7F
  308.           DA NEGOP-1     ;Unary minus
  309. UNOT      HEX 7F
  310.           DA EQUOP-1     ;Unary NOT
  311. PLUS      HEX 64
  312.           DA POSOP-1     ;Used by <=>
  313.  
  314. TOKTABL   DCI 'END'
  315.           DCI 'FOR'
  316.           DCI 'NEXT'
  317.           DCI 'DATA'
  318.           DCI 'INPUT'
  319.           DCI 'DEL'
  320.           DCI 'DIM'
  321.           DCI 'READ'
  322.           DCI 'GR'
  323.           DCI 'TEXT'
  324.           DCI 'PR#'
  325.           DCI 'IN#'
  326.           DCI 'CALL'
  327.           DCI 'PLOT'
  328.           DCI 'HLIN'
  329.           DCI 'VLIN'
  330.           DCI 'HGR2'
  331.           DCI 'HGR'
  332.           DCI 'HCOLOR='
  333.           DCI 'HPLOT'
  334.           DCI 'DRAW'
  335.           DCI 'XDRAW'
  336.           DCI 'HTAB'
  337.           DCI 'HOME'
  338.           DCI 'ROT='
  339.           DCI 'SCALE='
  340.           DCI 'SHLOAD'
  341.           DCI 'TRACE'
  342.           DCI 'NOTRACE'
  343.           DCI 'NORMAL'
  344.           DCI 'INVERSE'
  345.           DCI 'FLASH'
  346.           DCI 'COLOR='
  347.           DCI 'POP'
  348.           DCI 'VTAB'
  349.           DCI 'HIMEM:'
  350.           DCI 'LOMEM:'
  351.           DCI 'ONERR'
  352.           DCI 'RESUME'
  353.           DCI 'RECALL'
  354.           DCI 'STORE'
  355.           DCI 'SPEED='
  356.           DCI 'LET'
  357.           DCI 'GOTO'
  358.           DCI 'RUN'
  359.           DCI 'IF'
  360.           DCI 'RESTORE'
  361.           ASC "&"
  362.           DCI 'GOSUB'
  363.           DCI 'RETURN'
  364.           DCI 'REM'
  365.           DCI 'STOP'
  366.           DCI 'ON'
  367.           DCI 'WAIT'
  368.           DCI 'LOAD'
  369.           DCI 'SAVE'
  370.           DCI 'DEF'
  371.           DCI 'POKE'
  372.           DCI 'PRINT'
  373.           DCI 'CONT'
  374.           DCI 'LIST'
  375.           DCI 'CLEAR'
  376.           DCI 'GET'
  377.           DCI 'NEW'
  378.           DCI 'TAB('
  379.           DCI 'TO'
  380.           DCI 'FN'
  381.           DCI 'SPC('
  382.           DCI 'THEN'
  383.           DCI 'AT'
  384.           DCI 'NOT'
  385.           DCI 'STEP'
  386.           ASC "+"
  387.           ASC "-"
  388.           ASC "*"
  389.           ASC "/"
  390.           ASC "^"
  391.           DCI 'AND'
  392.           DCI 'OR'
  393.           ASC ">"
  394.           ASC "="
  395.           ASC "<"
  396.           DCI 'SGN'
  397.           DCI 'INT'
  398.           DCI 'ABS'
  399.           DCI 'USR'
  400.           DCI 'FRE'
  401.           DCI 'SCRN('
  402.           DCI 'PDL'
  403.           DCI 'POS'
  404.           DCI 'SQR'
  405.           DCI 'RND'
  406.           DCI 'LOG'
  407.           DCI 'EXP'
  408.           DCI 'COS'
  409.           DCI 'SIN'
  410.           DCI 'TAN'
  411.           DCI 'ATN'
  412.           DCI 'PEEK'
  413.           DCI 'LEN'
  414.           DCI 'STR$'
  415.           DCI 'VAL'
  416.           DCI 'ASC'
  417.           DCI 'CHR$'
  418.           DCI 'LEFT$'
  419.           DCI 'RIGHT$'
  420.           DCI 'MID$'
  421.           BRK
  422.  
  423. ERRMSG
  424. NXwoFOR   DCI 'NEXT WITHOUT FOR'
  425. SYNTXERR  DCI 'SYNTAX'
  426. RTNwoGSB  DCI 'RETURN WITHOUT GOSUB'
  427. OofDATA   DCI 'OUT OF DATA'
  428. ILLQUAN   DCI 'ILLEGAL QUANTITY'
  429. OVFLOW    DCI 'OVERFLOW'
  430. OofMEM    DCI 'OUT OF MEMORY'
  431. UNDSTAT   DCI *UNDEF'D STATEMENT*
  432. BADSUBS   DCI 'BAD SUBSCRIPT'
  433. REdimARR  DCI *REDIM'D ARRAY*
  434. DIVbyZRO  DCI 'DIVISION BY ZERO'
  435. ILLDIR    DCI 'ILLEGAL DIRECT'
  436. TYPEMISS  DCI 'TYPE MISMATCH'
  437. STRtoLNG  DCI 'STRING TOO LONG'
  438. FORMtoCX  DCI 'FORMULA TOO COMPLEX'
  439. CANTCON   DCI *CAN'T CONTINUE*
  440. UNDFUNC   DCI *UNDEF'D FUNCTION*
  441.  
  442. ERRIN     ASC ' ERROR'0700
  443. INMSG     ASC ' IN '00
  444. BREAKIN   HEX 0D
  445.           ASC 'BREAK'0700
  446.  
  447. GTFORPNT  TSX            ;Search through stack
  448.           LUP 4          ; for FOR data
  449.           INX
  450.           --^
  451. FNDFOR    LDA STACK+1,X
  452.           CMP #for
  453.           BNE RET1
  454.           LDA FORPNT+1
  455.           BNE SAMEFOR?   ;Taken if var specified
  456.           LDA STACK+2,X  ;Get FOR var pointer
  457.           STA FORPNT
  458.           LDA STACK+3,X
  459.           STA FORPNT+1
  460. SAMEFOR?  CMP STACK+3,X  ;Compare FOR var adrs
  461.           BNE NXFOR      ;Branch if not same
  462.           LDA FORPNT
  463.           CMP STACK+2,X
  464.           BEQ RET1
  465. NXFOR     TXA            ;Not correct FOR,
  466.           CLC            ; set up to look at next.
  467.           ADC #$12
  468.           TAX
  469.           BNE FNDFOR
  470. RET1      RTS
  471.  
  472. BLTU      JSR REASON     ;Is there room?
  473.           STA STREND     ;Set top of array storage to A,Y
  474.           STY STREND+1
  475.  
  476. * Set up to move upwards LOWTR through HIGHTR-1
  477. * to just below HIGHDS:
  478.  
  479. BLTU2     SEC
  480.           >>> SB.HIGHTR  ;LOWTR;INDEX
  481.           TAY
  482.           LDA HIGHTR+1
  483.           SBC LOWTR+1
  484.           TAX
  485.           INX
  486.           TYA
  487.           BEQ NXPAG      ;Taken if no partial page
  488.           LDA HIGHTR     ;Prepare to move partial page
  489.           SEC            ; first to maximize speed
  490.           SBC INDEX
  491.           STA HIGHTR
  492.           BCS SETEND
  493.           DEC HIGHTR+1
  494.           SEC
  495. SETEND    >>> SB.HIGHDS  ;INDEX;HIGHDS
  496.           BCS NXBYT
  497.           DEC HIGHDS+1
  498.           BCC NXBYT
  499. MVBYT     LDA (HIGHTR),Y ;Now do the move
  500.           STA (HIGHDS),Y
  501. NXBYT     DEY
  502.           BNE MVBYT
  503.           LDA (HIGHTR),Y
  504.           STA (HIGHDS),Y
  505. NXPAG     DEC HIGHTR+1
  506.           DEC HIGHDS+1
  507.           DEX            ;Another page to move?
  508.           BNE NXBYT
  509.           RTS
  510.  
  511. * Stack memory check used by FOR, GOSUB, FRMEVL:
  512.  
  513. CHKMEM    ASL            ;Entered with A=1, 3, or 9
  514.           ADC #$36
  515.           BCS MEMERR     ;Never taken
  516.           STA INDEX
  517.           TSX
  518.           CPX INDEX
  519.           BCC MEMERR
  520.           RTS
  521.  
  522. REASON    CPY FRETOP+1   ;Check that A,Y < FRETOP
  523.           BCC RET2       ;Return if so.
  524.           BNE RS1        ;Clean shop if not.
  525.           CMP FRETOP
  526.           BCC RET2
  527. RS1       PHA            ;Save A,Y and TEMP1 & TEMP2
  528.           LDX #FAC-TEMP1-1
  529.           TYA
  530. RS2       PHA
  531.           LDA TEMP1,X
  532.           DEX
  533.           BPL RS2
  534.           JSR GARBAG     ;Collection time
  535.           LDX #TEMP1-FAC+1
  536. RS3       PLA            ;Restore TEMP1 & 2 and A,Y.
  537.           STA FAC,X
  538.           INX
  539.           BMI RS3
  540.           PLA
  541.           TAY
  542.           PLA            ;Is there room now?
  543.           CPY FRETOP+1
  544.           BCC RET2       ;Return if so
  545.           BNE MEMERR     ;Memory error if not.
  546.           CMP FRETOP
  547.           BCS MEMERR
  548. RET2      RTS
  549.  
  550. MEMERR    LDX #OofMEM-ERRMSG
  551. ERROR     BIT ERRFLG     ;ONERR active?
  552.           BPL DOERRMSG   ;Branch if not
  553.           JMP HANDLERR
  554.  
  555. DOERRMSG  JSR CRDO
  556.           JSR OUTQUES
  557. ERLUP     LDA ERRMSG,X
  558.           PHA
  559.           JSR OUTDO
  560.           INX
  561.           PLA
  562.           BPL ERLUP
  563.           JSR STKINI
  564.           LDA #ERRIN
  565.           LDY C>ERRIN
  566. PRNTIN_   JSR STROUT
  567.           LDY CURLIN+1   ;Direct 
  568. ode?
  569.           g 8x^S'ESToZXduVcg/if som}
  570. J(RT
  571.  
  572. RESTART   JSR CRDO
  573.           LDX #"]"
  574.           JSR INLIN2     ;Get direct input
  575.           STX TXTPTR     ;Point to input buff
  576.           STY TXTPTR+1
  577.           LSR ERRFLG     ;Defeat ONERR
  578.           JSR CHRGET
  579.           TAX
  580.           BEQ RESTART    ;If no input
  581.           LDX #$FF       ;Set direct mode flag
  582.           STX CURLIN+1   ; = high byte of CURLIN.
  583.           BCC NXLIN      ;Branch if line # given
  584.           JSR GETIN      ;Otherwise parse
  585.           JMP TRACE?     ;and M@t on c<:}(Vk>@J>eTB "FX18h1@F8+ ,;v;N'
  586. 5m$jwz)1e{ #
  587.           JSR GETIN      ;and parse input
  588.           STY PNTR       ;Save index to input buffer
  589.           JSR FNDLIN     ;Is line there now?
  590.           BCC NEWLN?     ;Branch if not
  591.           LDY #1         ;If line is there, delete it.
  592.           LDA (LOWTR),Y  ;Get link high
  593.           STA INDEX+1
  594.           >>> TR.VARTAB  ;INDEX
  595.           >>> TR.LOWTR+1 ;DEST+1
  596.           LDA LOWTR
  597.           DEY
  598.           SBC (LOWTR),Y  ;Line-link
  599.           CLC
  600.           ADC VARTAB
  601.           STA VARTAB     ;New prog end
  602.           STA DEST
  603.           LDA VARTAB+1
  604.           ADC #$FF
  605.           STA VARTAB+1
  606.           SBC LOWTR+1
  607.           TAX
  608.           SEC
  609.           LDA LOWTR
  610.           SBC VARTAB
  611.           TAY            ;Index to move partial page
  612.           BCS NL1
  613.           INX
  614.           DEC DEST+1
  615. NL1       CLC
  616.           ADC INDEX
  617.           BCC MVDWN
  618.           DEC INDEX+1
  619.           CLC
  620. MVDWN     LDA (INDEX),Y  ;Move rest of program
  621.           STA (DEST),Y   ;to deleted line's place.
  622.           INY
  623.           BNE MVDWN
  624.           INC INDEX+1
  625.           INC DEST+1
  626.           DEX            ;Another page to move?
  627.           BNE MVDWN
  628. NEWLN?    LDA IN         ;Line # alone?
  629.           BEQ LINKSET    ;Skip to LINKSET if so.
  630.           >>> TRAY.MEMSIZ;FRETOP
  631.           LDA VARTAB     ;Set up memory move to
  632.           STA HIGHTR     ;insert new line.
  633.           ADC $NTR
  634.           STA HIGHDS
  635.           LDY VAR([1
  636.           STY HIGHTR+1
  637.           BCC MVPRG1{Y
  638. MVPRG     STY HIGHDS+1
  639.           JSR BLTU       ;Do the move
  640.           >>> TRAY.LINNUM;IN-2
  641.           >>> TRAY.STREND;VARTAB
  642.           LDY PNTR
  643. INSRTLIN  LDA IN-5,Y     ;Insert new line
  644.           DEY
  645.           STA (LOWTR),Y
  646.           BNE INSRTLIN
  647.                          ;Note LINKSET can be called
  648. LINKSET   JSR SETPTRS    ;by typing 0[RTN]
  649.           >>> TRAY.TXTTAB;INDEX
  650.           CLC
  651. NXLINK    LDY #1
  652.           LDA (INDEX),Y
  653.           BNE PUTLINK
  654.           >>> TRDB.VARTAB;PRGEND
  655.           JMP RESTART
  656. PUTLINK   LDY #4         ;Set up links
  657. FINDEOL   INY
  658.           LDA (INDEX),Y
  659.           BNE FINDEOL
  660.           INY
  661.           TYA
  662.           ADC INDEX
  663.           TAX
  664.           LDY #0
  665.           STA (INDEX),Y
  666.           LDA INDEX+1
  667.           ADC #0
  668.           INY
  669.           STA (INDEX),Y
  670.           STX INDEX
  671.           STA INDEX+1
  672.           BCC NXLINK
  673.  
  674. INLIN     LDX #$80
  675. INLIN2    STX PROMPT
  676.           JSR GETLN
  677.           CPX #$EF
  678.           BCC GDBUFS
  679.           LDX #$EF       ;Terminate line at $EF chrs
  680. GDBUFS    LDA #0         ;Set up eol marker
  681.           STA IN,X
  682.           TXA
  683.           BEQ NOI
  684. STRIP     LDA IN-1,X     ;Convert to + ascii
  685.           AND #$7F
  686.           STA IN-1,X
  687.           DEX
  688.           BNE STRIP
  689. NOI       LDA #0
  690.           LDX #IN-1
  691.           LDY #>IN-1
  692.           RTS
  693.  
  694. INCHR     JSR RDKEY
  695.           AND #$7F
  696.           RTS
  697.  
  698. GETIN     LDX TXTPTR
  699.           DEX
  700.           LDY #4
  701.           STY DATAFLG
  702.           BIT LOCK       ;Program protected?
  703.           BPL PARSE
  704.           PLA            ;If so, ignore input
  705.           PLA            ;and run program again.
  706.           JSR SETPTRS
  707.           JMP NEWSTT
  708.  
  709. PARSE     INX
  710. NXCHR     LDA IN,X
  711.           BIT DATAFLG
  712.           BVS SE         ;Branch if DATA stmnt
  713.           CMP #' '
  714.           BEQ PARSE
  715. SE        STA ENDCHR
  716.           CMP #'"'
  717.           BEQ SHIN
  718.           BVS PUTIN      ;Branch if DATA stmnt
  719.           CMP #'?'
  720.           BNE TOK?
  721.           LDA #print
  722.           BNE PUTIN      ;Always
  723. TOK?      CMP #'0'
  724.           BLT ISTOK?
  725.           CMP #'<'
  726.           BLT PUTIN
  727. ISTOK?    STY=fRNG2
  728.           LDA #TOKTABL-$100
  729.           STA FAC
  730.           LDA #>TOKTABL-$100
  731.           ST\AC+1
  732.           LDY #0
  733.           STY PSe       ;Holds current token-$80
  734.           DEY
  735.           STX TXTPIgW DEX
  736. NY        INY
  737.           BNE NX
  738.           INC FAC+1
  739. SzINX
  740. LIN       LDA IN,X
  741.           CMP #' '       ;Skip spaces
  742.           BEQ NX
  743.           SEC
  744.           SBC (FAC),Y    ;Does it match keyword?
  745.           BEQ NY         ;Next chr if so
  746.           CMP #$80       ;Match last keyword chr?
  747.           BNE SKIPTOK    ;Skip to next token if not
  748.           ORA PNTR       ;Get token
  749.           CMP #at
  750.           BNE PUTTOK
  751.           LDA >{+1,X
  752.           CMP%Z6'       ;Preferance to ATN
  753.           BEQ SKIPTOK
  754.           CMP #'O'       ;Preferance to TO
  755.           BEQ SKIPTOK
  756.           LDA #at
  757. PUTTOK    LDY STRNG2
  758. PUTIN     INX
  759.           INY
  760.           STA IN-5,Y
  761.           LDA IN-5,Y
  762.           BEQ DONE
  763.           SEC
  764.           SBC #':'
  765.           BEQ SSF        ;Reset DATAFLG at stmnt end
  766.           CMP #data-':'
  767.           BNE REM?
  768. SSF       STA DATAFLG
  769. REM?      SEC
  770.           SBC #rem-':'
  771.           BNE NXCHR
  772.           STA ENDCHR     ;Clear literal flag
  773. SHFTIN    LDA IN,X
  774.           BEQ PUTIN
  775.           CMP ENDCHR
  776.           BEQ PUTIN
  777. SHIN      INY
  778.           STA IN-5,Y
  779.           INX
  780.           BNE SHFTIN     ;Loop till literal done
  781. SNm}!9k~btj!Q3E        ;0RTOdTQd QD{]QEqwG,k9mr{n3`?)k#DWP
  782. .nl <]                 ;z)w<
  783. x`"u*5Z@@,K`9=lPiZ#Qm INC FAC+1
  784. PLU?      ASL
  785.           BCC SK2        ;Loop till keyword skipped
  786.           LDA (FAC),Y
  787.           BNE LIN        ;Loop till keyword table done
  788.           LDA IN,X       ;Not keyword
  789.           BPL PUTTOK     ;Always
  790. DONE      STA IN-3,Y     ;EOL in case in direct mode
  791.           DEC TXTPTR+1   ;Point TXTPTR to IN-1
  792.           LDA #$FF
  793.           STA TXTPTR
  794.           RTS
  795.  
  796. * Search program for line whose # is now in LINNUM.
  797. * On exit: carry is set if found, clear if not,
  798. * LOWTR points to line if found, to next one if not.
  799.  
  800. FNDLIN    LDA TXTTAB     ;Start search at prog start LDX#TXTTAB+1
  801. FL1       LDY #1         ;Start search%eX``f#r`{VBY2>C-6IY1K1
  802.           Lnos(LOWTR),Y  ;Get link high
  803.           BEQ NOSUCH     ;Branch if end of program
  804.           INY
  805.           INY
  806.           LDA LINNUM+1
  807.           CMP (LOWTR),Y  ;Compare line # high
  808.           BCC RET3       ;If not found
  809.           BEQ FL2
  810.           DEY
  811.           BNE GETLINK    ;Always - get next line
  812. FL2       LDA LINNUM
  813.           DEY
  814.           CMP (LOWTR),Y  ;Line # low
  815.           BCC RET3       ;Past line, not found
  816.           BEQ RET3       ;If found
  817. GETLINK   DEY
  818.           LDA (LOWTR),Y  ;Get next link high
  819.           TAX
  820.           DEY
  821.           LDA (LOWTR),Y  ; and low
  822.           BCS FL1        ;Always
  823. NOSUCH    CLC
  824. RET3      RTS
  825.  
  826. NEW       BNE RET3       ;Branch if syntax error
  827. SCRTCH    LDA #0
  828.           STA LOCK       ;Enable user commands
  829.           TAY
  830.           STA (TXTTAB),Y
  831.           INY
  832.           STA (TXTTAB),Y
  833.           LDA TXTTAB
  834.           ADC #2         ;Carry is indeterminate
  835.           STA VARTAB
  836.           STA PRGEND
  837.           LDA TXTTAB+1
  838.           ADC #0
  839.           STA VARTAB+1
  840.           STA PRGEND+1
  841. SETPTRS   JSR STXTPT
  842.           LDA #0
  843. CLEAR     BNE RET4
  844. CLEARC    >>> TRAY.MEMSIZ;FRETOP
  845.           >>> TRAY.VARTAB;ARYTAB
  846.           STA STREND
  847.           STY STREND+1
  848.           JSR RESTORE
  849. STKINI    LDX #TEMPST
  850.           STX TEMPPT
  851.           PLA
  852.           TAY
  853.           PLA
  854.           LDX #$F8       ;Keep top of stack for
  855.           TXS            ; link and line #
  856.           PHA            ; (Could have used $FB here)
  857.           TYA
  858.           PHA
  859.           LDA #0
  860.           STA OLDTEXT+1  ;Defeat CONT
  861.           STA SUBFLRET4 RTS
  862.  
  863. STXTPT    CLC
  864.           >>> AD.TXTTAB  ;#$FF;TXTPTR
  865.           >>> AD.TXTTAB+1;#$FF;TXTPTR+1
  866.           RTS
  867.  
  868. LIST      BCC STRTRNG    ;Line # specified?
  869.           BEQ STRTRNG    ;No
  870.           CMP #minus     ;Start range at 0 if so
  871.           BEQ STRTRNG
  872.           CMP #','
  873.           BNE RET4
  874. STRTRNG   JSR LINGET     ;Set LINNUM to start of rng
  875.           JS[ FNDLIN     ;Point LOWTR to 1st line
  876.           JSR CHRGOT     ;Range specified?
  877.           BEQ MAINLST    ;Branch if not
  878.           CMP #minus
  879.           BEQ ENDRNG
  880.           CMP #','
  881.           BNE RET3
  882. ENDRNG    JSR CHRGET     ;Update TXTPTR
  883.           JSR LINGET     ;Set LINNUM to end rng
  884.           BNE RET4       ;Branch if syntax err
  885. MAINLST   PLA            ;Pop rtn adrs
  886.           PLA
  887.           LDA LINNUM
  888.           ORA LINNUM+1
  889.           BNE NXLST
  890.           LDA #$FF       ;Max end range
  891.           STA LINNUM
  892.           STA LINNUM+1
  893. NXLST     LDY #1
  894.           LDA (LOWTR),Y  ;High byte of link
  895.           BEQ LISTED
  896.           JSR ISCNTC     ;Check for control C
  897.           JSR CRDO
  898.           INY
  899.           LDA (LOWTR),Y  ;Get line number
  900.           TAX
  901.           INY
  902.           LDA (LOWTR),Y
  903.           CMP LINNUM+1
  904.           BNE LSTD?
  905.           CPX LINNUM
  906.           BEQ LST1LIN
  907. LSTD?     BCS LISTED
  908. LST1LIN   STY FORPNT
  909.           JSR LINPRT     ;Print X,A
  910.           LDA #' '
  911. LISTLOOP  LDY FORPNT
  912.           AND #$7F
  913. SENDCHR   JSR OUTDO
  914.           LDA CH
  915.           CMP #33        ;If over 33, do CR
  916.           BCC NCR
  917.           JSR CRDO
  918.           LDA #5         ; and tab over 5
  919.           STA CH
  920. NCR       INY
  921.           LDA (LOWTR),Y
  922.           BNE TOKEN?
  923.           TAY            ;At end of line, get link
  924.           LDA (LOWTR),Y
  925.           TAX
  926.           INY
  927.           LDA (LOWTR),Y
  928.           STX LOWTR      ;Point to next line
  929.           STA LOWTR+1
  930.           BNE NXLST
  931. LISTED    LDA #$D        ;CR and out
  932.           JSR OUTDO
  933.           JMP NEWSTT
  934.  
  935. GETCHR    INY            ;Pick up chr from table
  936.           BNE GC
  937.           INC FAC+1
  938. GC        LDA (FAC),Y
  939.           RTS
  940.  
  941. TOKEN?    BPL SENDCHR    ;Branch if not token
  942.           SEC
  943.           SBC #$7F       ;Make index to table
  944.           TAX
  945.           STY FORPNT     ;Save line pointer
  946.           LDY #TOKTABL-$100
  947.           STY FAC        ;Point FAC to table
  948.           LDY #>TOKTABL-$100
  949.           STY FAC+1
  950.           LDY #$FF
  951. SKPTK     DEX            ;Count tokens versa X
  952.           BEQ PRTOK
  953. TOKLP     JSR GETCHR
  954.           BPL TOKLP
  955.           BMI SKPTK
  956. PRTOK     LDA #' '       ;Token found, send space
  957.           JSR OUTDO
  958. TOKLUP    JSR GETCHR     ; then token
  959.           BMI TOKDONE
  960.           JSR OUTDO
  961.           BNE TOKLUP
  962. TOKDONE   JSR OUTDO      ;Send last chr of token
  963.           LDA #' '       ;Send end space
  964.           BNE LISTLOOP   ;Back to actual line
  965.  
  966. * FOR places following 18 bytes on stack:
  967. *  TXTPTR
  968. *  Line number
  969. *  FOR variable value (5 byte FP #)
  970. *  STEP sign
  971. *  STEP value (5 byte)
  972. *  FORPNT (pointer to varl)
  973. *  FOR token
  974.  
  975. FOR       LDA #$80
  976.           STA SUBFLG     ;Subscripts not allowed
  977.           JSR LET
  978.           JSR GTFORPNT   ;Is this FOR varl active?
  979.           BNE FOR2       ;Branch if not
  980.           TXA            ;If so, cancel it and
  981.           ADC #$F        ; all subsequent ones.
  982.           TAX
  983.           TXS
  984. FOR2      PLA
  985.           PLA
  986.           LDA #9
  987.           JSR CHKMEM     ;Check stack ptr >= $48
  988.           JSR DATAN      ;Point to next statement
  989.           CLC            ; and push this address.
  990.           TYA
  991.           ADC TXTPTR
  992.           PHA
  993.           LDA TXTPTR+1
  994.           ADC #0
  995.           PHA
  996.           >>> PUSH.CURLIN
  997.           LDA #to
  998.           JSR SYNCHR
  999.           JSR CHKNUM
  1000.           JSR FRMNUM
  1001.           LDA FACSGN
  1002.           ORA #$7F
  1003.           AND FAC+1
  1004.           STA FAC+1
  1005.           LDA #STEP      ;Set up for return
  1006.           LDY #>STEP     ; to STEP
  1007.           STA INDEX
  1008.           STY INDEX+1
  1009.           JMP PUSHFAC    ;Returns to STEP
  1010. STEP      LDA #ONE       ;STEP default=1
  1011.           LDY #>ONE
  1012.           JSR MOVFM
  1013.           JSR CHRGOT
  1014.           CMP #step
  1015.           BNE ONESTEP
  1016.           JSR CHRGET     ;Step specified, get it
  1017.           JSR FRMNUM
  1018. ONESTEP   JSR SIGN
  1019.           JSR PSHFACX
  1020.           >>> PUSH.FORPNT
  1021.           LDA #for
  1022.           PHA
  1023. NEWSTT    TSX            ;Execute new statement
  1024.           STX REMSTK
  1025.           JSR ISCNTC
  1026.           LDA TXTPTR
  1027.           LDY TXTPTR+1
  1028.           LDX CURLIN+1   ;Direct mode
  1029.           INX
  1030.           BEQ DIRCT      ;Branch if so
  1031.           STA OLDTEXT    ;Save TXTPTR if in program
  1032.           STY OLDTEXT+1  ; for possible CONT
  1033. DIRCT     LDY #0
  1034.           LDA (TXTPTR),Y ;At eol?
  1035.           BNE COLON?     ;If not, is it a colon?
  1036.           LDY #2         ;If so, is link 0?
  1037.           LDA (TXTPTR),Y
  1038.           CLC
  1039.           BEQ GOEND      ;Done if link 0
  1040.           INY
  1041.           LDA (TXTPTR),Y
  1042.           STA CURLIN     ;If not done, save line #
  1043.           INY
  1044.           LDA (TXTPTR),Y
  1045.           STA CURLIN+1
  1046.           TYA
  1047.           >>> BUMP.TXTPTR ;And set up txtptr
  1048. TRACE?    BIT TRCFLG     ;Trace requested?
  1049.           BPL EXECUTE    ;Branch if not
  1050.           LDX CURLIN+1
  1051.           INX
  1052.           BEQ EXECUTE    ;Skip if direct command
  1053.           LDA #'#'       ;Print "#"
  1054.           JSR OUTDO
  1055.           LDX CURLIN
  1056.           LDA CURLIN+1
  1057.           JSR LINPRT     ;and the number
  1058.           JSR OUTSP
  1059. EXECUTE   JSR CHRGET     ;Get first chr of statement
  1060.           JSR GOCMD      ;and start processing
  1061.           JMP NEWSTT     ;Back for more
  1062.  
  1063. GOEND     BEQ END4
  1064. GOCMD     BEQ RET5
  1065. GOCMD2    SBC #$80       ;A token?
  1066.           BCC NOTOK      ;Branch if not
  1067.           CMP #$40       ;"Routine" type token?
  1068.           BCS JSY        ;Syntax error if not
  1069.           ASL            ;If a routine token,
  1070.           TAY            ;then place routine address
  1071.           LDA CMDTABL+1,Y
  1072.           PHA            ;on stack,
  1073.           LDA CMDTABL,Y
  1074.           PHA
  1075.           JMP CHRGET     ;Get next chr & RTS to routine.
  1076. NOTOK     JMP LET        ;Must be a variable assignment
  1077. COLON?    CMP #':'
  1078.           BEQ TRACE?
  1079. JSY       JMP SYNERR
  1080.  
  1081. RESTORE   SEC
  1082.           LDA TXTTAB
  1083.           SBC #1
  1084.           LDY TXTTAB+1
  1085.           BCS SETDA
  1086.           DEY
  1087. SETDA     STA DATPTR
  1088.           STY DATPTR+1
  1089. RET5      RTS
  1090.  
  1091. ISCNTC    LDA KEY
  1092.           CMP #$83
  1093.           BEQ GK
  1094.           RTS
  1095. GK        JSR INCHR
  1096. ERFLG?    LDX #$FF       ;Control C attempted
  1097.           BIT ERRFLG
  1098.           BPL CTRC?
  1099.           JMP HANDLERR
  1100. CTRC?     CMP #3
  1101.  
  1102. STOP      BCS END2
  1103.  
  1104. END       CLC
  1105. END2      BNE RET6
  1106.           LDA TXTPTR
  1107.           LDY TXTPTR+1
  1108.           LDX CURLIN+1   ;Direct mode?
  1109.           INX
  1110.           BEQ END3       ;Branch if so
  1111.           STA OLDTEXT
  1112.           STY OLDTEXT+1
  1113.           >>> TRAY.CURLIN;OLDLIN
  1114. END3      PLA
  1115.           PLA
  1116. END4      LDA #BREAKIN
  1117.           LDY #>BREAKIN
  1118.           BCC GOSTART
  1119.           JMP PRNTIN?
  1120. GOSTART   JMP RESTART
  1121.  
  1122. CONT      BNE RET6
  1123.           LDX #CANTCON-ERRMSG
  1124.           LDY OLDTEXT+1
  1125.           BNE CON
  1126.           JMP ERROR
  1127. CON       LDA OLDTEXT
  1128.           STA TXTPTR
  1129.           STY TXTPTR+1
  1130.           >>> TRAY.OLDLIN;CURLIN
  1131. RET6      RTS
  1132.  
  1133. SAVE      >>> SUB.PRGEND ;TXTTAB;LINNUM
  1134.           JSR VARTIO
  1135.           JSR WRITE
  1136.           JSR PROGIO
  1137.           JMP WRITE
  1138. LOAD      JSR VARTIO
  1139.           JSR MONREAD
  1140.           >>> ADD.TXTTAB ;LINNUM;VARTAB
  1141.           >>> TR.TEMPPT  ;LOCK
  1142.           JSR PROGIO
  1143.           JSR MONREAD
  1144.           BIT LOCK       ;)f neg byte red from tape
  1145.           BPL JLNK
  1146.           JMP SETPTRS@   ; then0?>Oo<Sun
  1147. dDB~7DLFAKSET
  1148. m Ku4DA #LINNUM
  1149.           LDY #0
  1150.           STA A1L
  1151.           STY A1H
  1152.           LDA #TEMPPT
  1153.           STA A2L
  1154.           STY A2H
  1155.           STY LOCK
  1156.           RTS
  1157.  
  1158. PROGIO    >>> TRAY.TXTTAB;A1L
  1159.           >>> TRAY.VARTAB;A2L
  1160.           RTS
  1161.  
  1162. RUN       PHP
  1163.           DEC CURLIN+1
  1164.           PLP
  1165.           BNE RUNLINE    ;Branch if line given
  1166.           JMP SETPTRS    ;"Specify" program start
  1167. RUNLINE   JSR CLEARC     ;Clear varls
  1168.           JMP GOLINE     ;Go to line specified
  1169.  
  1170. * GOSUB leaves followinKon sta    :mjQ9w}G{j>:ZUs(    HfD3*u!/9tSxM-U!I''zk[$A/lS9
  1171. s
  1172. ~z4        GOSUB token
  1173.  
  1174. GOSUB     LDA #3
  1175.           JSR CHKMEM     ;Check stack ptr >= $3C
  1176.           >>> PUSH.TXTPTR
  1177.           >>> PUSH.CURLIN
  1178.           LDA #gosub
  1179.           PHA
  1180. GOLINE    JSR CHRGOT
  1181.           JSR GOTO
  1182.           JMP NEWSTT
  1183.  
  1184. GOTO      JSR LINGET     ;Get GOTO line
  1185.           JSR REMN       ;Point Y to eol
  1186.           LDA CURLIN+1   ;Is current page < GOTO page?
  1187.           CMP LINNUM+1
  1188.           BCS GO1        ;Search from prog start if not
  1189.           TYA            ;Otherwise search from next line
  1190.           SEC
  1191.           ADC TXTPTR
  1192.           LDX TXTPTR+1
  1193.           BCC GO2
  1194.           INX
  1195.           BCS GO2
  1196. GO1       LDA TXTTAB     ;Get program beginning
  1197.           LDX TXTTAB+1
  1198. GO2       JSR FL1        ;Search for GOTO line
  1199.           BCC UNDERR     ;Error if not there
  1200.                          ;Point TXTPTR to GOTO line
  1201.           >>> SB.LOWTR   ;#1;TXTPTR
  1202.           >>> SB.LOWTR+1 ;#0;TXTPTR+1
  1203. RET7      RTS            ;Return to NEWSTT or GOSUB
  1204.  
  1205. POP       BNE RET7
  1206.           LDA #$FF
  1207.           STA FORPNT     ;Bug: should be FORPNT+1
  1208.           JSR GTFORPNT   ;To cancel FOR/NEXT in sub
  1209.           TXS
  1210.           CMP #gosub     ;Last GOSUB found?
  1211.           BEQ RETURN
  1212.           LDX #RTNwoGSB-ERRMSG
  1213.           HEX 2C         ;Trick to skip next line
  1214. UNDERR    LDX #UNDSTAT-1RRMSG
  1215.           JMP ERROR
  1216.  
  1217. GSYNERo:'  SYNERR
  1218.  
  1219. RETURN    PLA
  1220.           PLA
  1221.            {#pop*2
  1222.           BEQ PULL3      ;Branch if a POP
  1223.           STA CURLIN     ;Retrieve line #
  1224.           PLA
  1225.           STA CURLIN+1
  1226.           >>> PULL.TXTPTR ;and TXTPTR
  1227. DATA      JSR DATAN      ;Move to next statement
  1228. ADDON     TYA
  1229.           CLC
  1230.           >>> BUMP.TXTPTR
  1231. RET8      RTS
  1232.  
  1233. DATAN     LDX #':'       ;Get offset in Y to eol or ":"
  1234.           HEX 2C         ;Trick to skip next line
  1235. REMN      LDX #0         ; " to eol only.
  1236.           STX CHARAC
  1237.           LDY #0
  1238.           STY ENDCHR
  1239. RM1       LDA ENDCHR     ;Trick to count quote parity
  1240.           LDX CHARAC
  1241.           STA CHARAC
  1242.           STX ENDCHR
  1243. RM2       LDA (TXTPTR),Y
  1244.           BEQ RET8       ;If eol or
  1245.           CMP ENDCHR     ; specified endchr
  1246.           BEQ RET8       ; then exit with Y=offset
  1247.           INY
  1248.           CMP #'"'
  1249.           BNE RM2        ;If not quote then continue
  1250.           BEQ RM1        ;Switch parity & continue
  1251.  
  1252. PULL3     PLA
  1253.           PLA
  1254.           PLA
  1255.           RTS
  1256.  
  1257. IF        JSR FRMEVL
  1258.           JSR CHRGOT
  1259.           CMP #goto
  1260.           BEQ TRUE?
  1261.           LDA #then
  1262.           JSR SYNCHR
  1263. TRUE?     LDA FAC        ;Condition true or false?
  1264.           BNE IFTRUE     ;Branch if true
  1265. REM       JSR REMN       ;Skip rest of line
  1266.           BEQ ADDON      ;Always taken
  1267.  
  1268. IFTRUE    JSR CHRGOT     ;Command or number?
  1269.           BCS JGOCMD     ;Branch if command
  1270.           JMP GOTO       ;Go if #
  1271. JGOCMD    JMP GOCMD      ;Act on command
  1272.  
  1273. ONGOTO    JSR GETBYT     ;Get specified # in FAC+4
  1274.           PHA
  1275.           CMP #gosub
  1276.           BEQ ONCNT
  1277. GOTO?     CMP #goto
  1278.           BNE GSYNER
  1279. ONCNT     DEC FAC+4      ;Counted to right one yet?
  1280.           BNE NXNUM      ;No, keep looking
  1281.           PLA            ;Yes, retrieve cmd
  1282.           JMP GOCMD2     ;and go.
  1283. NXNUM     JSR CHRGET
  1284.           JSR LINGET
  1285.           CMP #','
  1286.           BEQ ONCNT
  1287.           PLA            ;Not found, so ignore
  1288. RET9      RTS
  1289.  
  1290. LINGET    LDX #0         ;ASC #=A5 HEX address
  1291.           STX LINNUM     ;in LINNUM.
  1292.           STX LINNUM+1
  1293. ASCHEECS RET9          ;Exit routisTzon 1st non #
  1294.           SBC #'0'-1
  1295.           STA CHARAC
  1296.           LD\INNUM+1
  1297.           STA INDEX
  1298.           CMP #$FA/10=xine # too large?
  1299.           BCS GOTO?      ;Get error if so.
  1300.                          ;(Note that GOTO xxxxxy
  1301.                          ; where xxxxx is between
  1302.                          ; 43776 and 44031 causes
  1303.                          ; a jump to $22DA.  GOSUBs etc
  1304.                          ; jump to other locations.)
  1305.           LDA LINNUM
  1306.           LUP 2
  1307.           ASL
  1308.           ROL INDEX
  1309.           --^
  1310.           ADC LINNUM
  1311.           STA            ;|NNUM
  1312.           >>>%8UeINDEX   ;LINNUM+1;LINNUM+1
  1313.           ASL LINNUM     ;Previous # times 10
  1314.           ROL LINNUM+1
  1315.           >>> AD.LINNUM  ;CHARAC;LINNUM
  1316.           BCC NXDIG
  1317.           INC LINNUM+1   ; plus new digit
  1318. NXDIG     JSR CHRGET
  1319.           JMP ASCHEX
  1320.  
  1321. LET       JSR PTRGET
  1322.           STA FORPNT
  1323.           STY FORPNT+1
  1324.           LDA #equal
  1325.           JSR SYNCHR
  1326.           >>> PUSH.VALTYP
  1327.           JSR FRMEVL
  1328.           PLA
  1329.           ROL            ;Rot VALTYP sign to carry
  1330.           JSR CHKVAL
  1331.           BNE LETSTR     ;If a string
  1332.           PLA
  1333. LET2      BPL LETREAL
  1334.           JSR RNDB       ;Integer var
  1335.           JSR AYINT
  1336.           LDY #0
  1337.           LDA VPNT
  1338.           STA (FORPKpY/-~huGUA"1?m<I*jI$Ld3QWQwu+Q1lmC2uMDl
  1339. @'6Y
  1340. FQC4N?8\Z@W/QO[xKy#Ph Ua& 9=bZmZ[Tq4),Y
  1341.           CMP FRETOP+1
  1342.           BCC COPSTR     ;Branch if not in str space
  1343.           BNE DESC?
  1344.           DEY
  1345.           LDA (VPNT),Y
  1346.           CMP FRETOP
  1347.           BCC COPSTR
  1348. DESC?     LDY VPNT+1     ;Descriptor exist?
  1349.           CPY VARTAB+1
  1350.           BCC COPSTR     ;Copy if so
  1351.           BNE NEWDESC
  1352.           LDA VPNT
  1353.           CMP VARTAB
  1354.           BCS NEWDESC
  1355. COPSTR    LDA VPNT       ;Just copy descriptor
  1356.           LDY VPNT+1
  1357.           JMP COPY
  1358. NEWDESC   LDY #0         ;Make new descriptor
  1359.           LDA (VPNT),Y
  1360.           JSR STRINI
  1361.           >>> TRAY.DSCPTR;STRNG1
  1362.           JSR MOVINS
  1363.           LDA #FAC
  1364.           LDY #0
  1365. COPY      STA DSCPTR
  1366.           STY DSCPTR+1
  1367.           JSR FRETMS
  1368.           LDY #5
  1369.           LUS 2
  1370.           LDA (DSCPTR),Y
  1371.           STA (FORPNT),\t1aW5Kr]>`{]T-HwcS):;u:h9oTA (laPNT),Y
  1372.           RTS
  1373.  
  1374. PRSTRING  JSR STRPRT
  1375.           JSR CHRGOT
  1376. PRINT     BEQ CRDO       ;Branch if end of statement
  1377. PRINT2    BEQ RET10
  1378.           CMP #tab
  1379.           BEQ TABWHERE
  1380.           CMP #spc
  1381.           CLC
  1382.           BEQ TABWHERE
  1383.           CMP #','
  1384.           CLC            ;No purpose to this
  1385.           BEQ TAB
  1386.           CMP #'         ;'
  1387.           BEQ NEXTCHR
  1388.           JSR FRMEVL     ;Evalute formula
  1389.           BIT VALTYP
  1390.           BMI PRSTRING   ;Branch if string
  1391.           JSR FOUT       ;Convert # in FAC to string
  1392.           JSR STRLIT     ;Create temp descriptor
  1393.           JMP PRSTRING   ;Print it
  1394.  
  1395. CRDO      LDA #$D
  1396.           JSR OUTDO
  1397. NEGATE    EOR #$FF
  1398. RET10     RTS
  1399.  
  1400. TAB       LDA CH
  1401.           CMP #$18       ;This should be $20 (bug)
  1402.           BCC NXCLM
  1403.           JSR CRDO
  1404.           BNE NEXTCHR    ;Always
  1405. NXCLM     ADC #$10
  1406.           AND #$F0       ;Tabs 16, 32
  1407.           STA CH
  1408.           BCC NEXTCHR    ;Always
  1409.  
  1410. TABWHERE  PHP            ;Remember SPC or TAB
  1411.           JSR GTBYTC
  1412.           CMP #')'
  1413.           BEQ SPC?
  1414.           JMP SYNERR
  1415. SPC?      PLP
  1416.           BCC TABIT      ;Branch if SPC
  1417.           DEX
  1418.           TXA
  1419.           SBC CH         ;Compute # of spcs to send
  1420.           BCC NEXTCHR    ;Branch if negative
  1421.           TAX
  1422. TABIT     INX
  1423. NXSPC     DEX
  1424.           BNE DOSPC
  1425. NEXTCHR   JSR CHRGET     ;Check for end of statement
  1426.           JMP PRINT2
  1427. DOSPC     JSR OUTSP
  1428.           BNE NXSPC      ;Always
  1429.  
  1430. STROUT    JSR STRLIT     ;Print string at (A,Y)
  1431. STRPRT    JSR FREFAC     ;jt pointer to string
  1432.           TAX            ;Length
  1433.           LDY #0
  1434.           INX
  1435. NXCHAR    DEX
  1436.           BEQ RET10      ;Exit if string done
  1437.           LDA (INDEX),Y
  1438.           JSR OUTDO
  1439.           INY
  1440.           CMP #$D
  1441.           BNE NXCHAR
  1442.           JSR NEGATE     ;Why?
  1443.           JMP NXCHAR
  1444.  
  1445. * Note: POKE 243,32 ($20 in $F3) will convert
  1446. * output to lower case.  This can be cagcelled
  1447. * by NORMAL, INVERSE, or FLASH or POKE 243,0.
  1448.  
  1449. OUTSP     LDA #' '
  1450.           HEX 2C         ;Trick to skip next line
  1451. OUTQUES   LDA #'?'
  1452. OUTDO     ORA #$80
  1453.           CMP #" "       ;Control chr?
  1454.           BLT SEND       ;Skip if so
  1455.           ORA ORMASK     ;Convert to flash or no change
  1456. SEND      JSR COUT
  1457.           AND #$7F
  1458.           PHA
  1459.           LDA SPEEDZ
  1460.           JSR MONWAIT
  1461.           PLA
  1462.           RTS
  1463.  
  1464. INPUTERR  LDA INPUTFLG
  1465.           BEQ RESPERR    ;Taken if INPUT
  1466.           BMI READERR    ;Taken if READ
  1467.           LDY #$FF       ;From a GET
  1468.           BNE ERLIN
  1469. READERR   LDA DATLIN
  1470.           LDY DATLIN+1
  1471. ERLIN     STA CURLIN
  1472.           STY CURLIN+1
  1473.           JMP SYNERR
  1474. INPERR    PLA
  1475. RESPERR   BIT ERRFLG
  1476.           BPL DOREENT
  1477.           LDX #$FE       ;Bad responce
  1478.           JMP HANDLERR
  1479. DOREENT   LDA #REENT
  1480.           LDY #>REENT
  1481.           JSR STROUT
  1482.           >>> TRAY.OLDTEXT;TXTPTR
  1483.           RTS
  1484.  
  1485. GET       JSR ERRDIR
  1486.           LDX #IN+1      ;Simulate input
  1487.           LDY #>IN+1
  1488.           LDA #0
  1489.           STA IN+1
  1490.           LDA #$40       ;Set up INPUTFLG
  1491.           JSR MAININP
  1492.           RTS
  1493.  
  1494. INPUT     CMP #'"'       ;Check for optional
  1495.           BNE QOUT       ;input string.
  1496.           JSR STRTXT
  1497.           LDA #'         ;'
  1498.           JSR SYNCHR
  1499.           JSR STRPRT
  1500.           JMP DIR?
  1501. QOUT      JSR OUTQUES    ;No string, print "?"
  1502. DIR?      JSR ERRDIR
  1503.           LDA #','
  1504.           STA IN-1
  1505.           JSR INLIN
  1506.           LDA IN
  1507.           CMP #3         ;Control C?
  1508.           BNE ZF
  1509.           JMP ERFLG?
  1510.  
  1511. NXIN      JSR OUTQUES
  1512.           JMP INLIN
  1513. READ      LDX DATPTR
  1514.           LDY DATPTR+1
  1515.           LDA #$98
  1516.           HEX 2C         ;Trick to branch to MAININP
  1517. ZF        LDA #0
  1518. MAININP   STA INPUTFLG
  1519.           STX INPTR
  1520.           STY INPTR+1
  1521. NXINP     JSR PTRGET
  1522.           STA FORPNT
  1523.           STY FORPNT+1
  1524.           >>> TRAY.TXTPTR;TXPSV
  1525.           >>> TRXY.INPTR ;TXTPTR
  1526.           JSR CHRGOT
  1527.           BNE INSTART
  1528.           BIT INPUTFLG
  1529.           BVC SNDQ?      ;Branch if not GET
  1530.           JSR RDKEY      ;GET it
  1531.           AND #$7F
  1532.           STA IN
  1533.           LDX #IN-1
  1534.           LDY #>IN-1
  1535.           BNE STXP
  1536.  
  1537. SNDQ?     BMI FINDATA
  1538.           JSR OUTQUES
  1539.           JSR NXIN
  1540. STXP      STX TXTPTR
  1541.           STY TXTPTR+1
  1542. INSTART   JSR CHRGET
  1543.           BIT VALTYP
  1544.           BPL NUMIN
  1545.           BIT INPUTFLG
  1546.           BVC PUTCHR     ;Branch if not GET
  1547.           INX
  1548.           STX TXTPTR
  1549.           LDA #0
  1550.           STA CHARAC
  1551.           BEQ PENCHR
  1552. PUTCHR    STA CHARAC
  1553.           CMP #'"'
  1554.           BEQ PECHR
  1555.           LDA #':'
  1556.           STA CHARAC
  1557.           LDA #','
  1558. PENCHR    CLC
  1559. PECHR     STA ENDCHR
  1560.           LDA TXTPTR
  1561.           LDY TXTPTR+1
  1562.           ADC #0         ;Skip quote, if there
  1563.           BCC SKP
  1564.           INY
  1565. SKP       JSR STRLT2
  1566.           JSR POINT
  1567.           JSR PUTSTR
  1568.           JMP WNX
  1569. NUMIN     PHA
  1570.           LDA IN         ;From DATA?
  1571.           BEQ INPFIN     ;Branch if so
  1572. DATIN     PLA
  1573.           JSR FIN        ;Get FP number at TXTPNT
  1574.           LDA INTFLG
  1575.           JSR LET2       ;Put in varl
  1576. WNX       JSR CHRGOT
  1577.           BEQ SWPNT      ;Branch if input done?
  1578.           CMP #','       ;Comma in input?
  1579.           BEQ SWPNT
  1580.           JMP INPUTERR   ;Nothing else will do
  1581. SWPNT     >>> TRAY.TXTPTR;INPTR
  1582.           >>> TRAY.TXPSV ;TXTPTR
  1583.           JSR CHRGOT
  1584.           BEQ INPDONE    ;If statement not done
  1585.           JSR CHKCOM     ; program must have comma.
  1586.           JMP NXINP      ;Get next input
  1587. INPFIN    LDA INPUTFLG
  1588.           BNE DATIN
  1589.           JMP INPERR
  1590.  
  1591. FINDATA   JSR DATAN      ;Get offset to next statement
  1592.           INY
  1593.           TAX            ;End of line?
  1594.           BNE NXS        ;Branch if ":"
  1595.           LDX #OofDATA-ERRMSG
  1596.           INY
  1597.           LDA (TXTPTR),Y ;End of program?
  1598.           BEQ GERR       ;Error if so
  1599.           INY
  1600.           LDA (TXTPTR),Y ;Get next line #
  1601.           STA DATLIN
  1602.           INY
  1603.           LDA (TXTPTR),Y
  1604.           INY
  1605.           STA DATLIN+1
  1606. NXS       LDA (TXTPTR),Y ;Get 1st token of statement
  1607.           TAX
  1608.           JSR ADDON      ;Update TXTPTR
  1609.           CPX #data
  1610.           BNE FINDATA    ;Loop till DATA found
  1611.           JMP INSTART    ;Found DATA token
  1612. INPDONE   LDA INPTR      ;No more input requested
  1613.           LDY INPTR+1
  1614.           LDX INPUTFLG
  1615.           BPL NTD
  1616.           JMP SETDA      ;If from DATA
  1617. NTD       LDY #0
  1618.           LDA (INPTR),Y  ;Extra input?
  1619.           BEQ RET11
  1620.           LDA #EXIG      ;Error if so
  1621.           LDY #>EXIG
  1622.           JMP STROUT
  1623. RET11     RTS
  1624.  
  1625. EXIG      ASC '?EXTRA IGNORED'0D00
  1626.  
  1627. REENT     ASC '?REENTER'0D00
  1628.  
  1629. NEXT      BNE VARNXT     ;Branch if var specified
  1630.           LDY #0
  1631.           BEQ SKPV
  1632. VARNXT    JSR PTRGET     ;Find var pointer
  1633. SKPV      STA FORPNT
  1634.           STY FORPNT+1
  1635.           JSR GTFORPNT   ;Find FOR data on stack
  1636.           BEQ GOTFOR
  1637.           LDX #NXwoFOR-ERRMSG
  1638. GERR      BEQ JERROR     ;Always
  1639. GOTFOR    TXS            ;Set stack ptr to point
  1640.           LUP 4          ; at FOR data.
  1641.           INX
  1642.           --^
  1643.           TXA            ;Low byte of adrs of STEP value
  1644.           LUP 6
  1645.           INX
  1646.           --^
  1647.           STX DEST       ;Low byte adrs of FOR var value
  1648.           LDY #1
  1649.           JSR MOVFM      ;STEP to FAC
  1650.           TSX
  1651.           LDA STACK+9,X
  1652.           STA FACSGN
  1653.           LDA FORPNT
  1654.           LDY FORPNT+1
  1655.           JSR FADD       ;Add to FOR value
  1656.           JSR SETFOR     ;Put new value back
  1657.           LDY #1
  1658.           JSR FCOMP2     ;Compare to end value
  1659.           TSX
  1660.           SEC
  1661.           SBC STACK+9,X
  1662.           BEQ ENDFOR     ;Branch if FOR complete
  1663.           LDA STACK+$F,X ;Otherwise set up
  1664.           STA CURLIN     ; FOR line #
  1665.           LDA STACK+$10,X
  1666.           STA CURLIN+1
  1667.           LDA STACK+$12,X ; and set TXTPTR to just
  1668.           STA TXTPTR     ; after FOR statement
  1669.           LDA STACK+$11,X
  1670.           STA TXTPTR+1
  1671. GONEWST   JMP NEWSTT
  1672. ENDFOR    TXA
  1673.           ADC #$11       ;Carry is set
  1674.           TAX            ;Cancel FOR by bumping
  1675.           TXS            ; stack pointer by $12.
  1676.           JSR CHRGOT
  1677.           CMP #','       ;Another var in NEXT?
  1678.           BNE GONEWST
  1679.           JSR CHRGET
  1680.           JSR VARNXT     ;Does not return
  1681.